package cn.org.xiaosheng.Tree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TreeDesign {

    private final Integer INTEGER_ZERO = 0;

    /**
     * 使用Map构建树
     */
    public List<Menu> buildTree(List<Menu> list) {
        ArrayList<Menu> res = new ArrayList<>();

        // 构建map, 以id为键
        Map<Integer,Menu> map = new HashMap<>();
        for (Menu menu : list) {
            menu.setSubMenus(new ArrayList<>());
            map.put(menu.getId(), menu);
        }

        // 遍历列表，将每个节点添加到父节点的子节点列表中
        for (Menu menu : list) {
            Menu parent = map.get(menu.getParentId());
            if (parent != null) {
                parent.getSubMenus().add(menu);
            }
            // 从根节点开始构建树，假设根节点的parentId为0
            if (INTEGER_ZERO.equals(menu.getParentId())) {
                res.add(menu);
            }
        }
        return res;
    }

    /**
     * 使用递归构建树
     * 使用递归行数虽然较少，但是我们会发现大量无效的循环被使用和可读性差的问题，不推荐。
     */
    public static List<Menu> recursiveTree(List<Menu> menus, int parentId) {
        List<Menu> tree = new ArrayList<>();
        for (Menu menu : menus) {
            if (menu.getParentId() == parentId) {
                menu.setSubMenus(recursiveTree(menus, menu.getId()));
                tree.add(menu);
            }
        }
        return tree;
    }

    /**
     * 生成数据
     */
    public static List<Menu> generateData() {
        Menu menu = new Menu(0, 0, null);
        List<Menu> list = new ArrayList<>();
        Menu menu_1 = new Menu(2, 1, null);
        Menu menu_2 = new Menu(3, 1, null);
        Menu menu_3 = new Menu(4, 1, null);
        Menu menu_4 = new Menu(5, 1, null);
        List<Menu> list_1 = new ArrayList<Menu>();
        list_1.add(menu_1);
        list_1.add(menu_2);
        list_1.add(menu_3);
        list_1.add(menu_4);
        list.add(new Menu(1, 0, list_1));

        List<Menu> list_2 = new ArrayList<Menu>();

        list_2.add(new Menu(6, 9, null));
        list_2.add(new Menu(7, 9, null));
        list_2.add(new Menu(8, 9, null));
        list.add(new Menu(9, 1, list_2));
        menu.setSubMenus(list);
        return list;
    }



}
